package com.elitel.frame.business.service;

import com.elitel.frame.main.entity.CfgDb;
import com.elitel.frame.main.entity.CfgEdit;
import com.elitel.frame.main.entity.CfgTable;
import com.elitel.frame.main.entity.ext.BaseQueryfieldExt;
import com.elitel.frame.main.entity.ext.BaseShowfieldExt;
import com.elitel.frame.main.entity.vo.ConQueryVo;

import java.util.List;
import java.util.Map;

/**
 * <pre>@ProjectName：frame-business-service    
 * @ClassName：TableFieldCommService    
 * @Description: TODO(查询表格显示字段和查询字段公共服务接口)    
 * @author guoyanfei  
 * @date：2017年11月2日 16:50       
 * @version </pre>
 */
public interface TableFieldCommService {
	
	/**
	 * show 查询服务显示列
	 * @param cfgDb(数据源)
	 * @param serviceID(服务ID)
	 * @param serviceType(服务类型,1单表查询服务,2主从表查询服务)
	 * @param masterDetailId(主从表服务-从表信息ID)
	 * @return 显示列集合
	 * @author guoyanfei
	 * @date 2017/11/17
	 */
	List<Map<String, String>> getServiceShowField(CfgDb cfgDb, String serviceID, String serviceType, String masterDetailId);
	
	/**
	 * <pre>querySingleTBList(单表显示字段)   
	 * @author guoyanfei 
	 * @param cfgDb(数据源)
	 * @param dtConfigId(表标识)
	 * @return</pre>
	 */
	List<Map<String,String>> getSingleTableShowField(CfgDb cfgDb, String dtConfigId);
	
	/**
	 * <pre>querySingleTBList(视图显示字段)   
	 * @author guoyanfei 
	 * @param cfgDb(数据源)
	 * @param dtConfigId(表标识)
	 * @return</pre>
	 */
	List<Map<String,String>> getViewShowField(CfgDb cfgDb, String dtConfigId);
	
	/**
	 * <pre>querySingleTBList(获取服务表格查询字段)   
	 * @author guoyanfei 
	 * @param cfgDb(数据源)
	 * @param serviceID(服务ID)
	 * @param serviceType(服务类型)
	 * @param grade(资源树层级)
	 * @return</pre>
	 */
	List<Map<String,String>> getTableQueryField(CfgDb cfgDb, String serviceID, Integer serviceType, String grade);
	
	/**
	 * <pre>getTablenameTxt(通过表标识获取表名称)   
	 * @author guoyanfei
	 * @param dtConfigId(表标识) 
	 * @param cfgDb(数据源)
	 * @return</pre>
	 */
	String getTablenameTxt(CfgDb cfgDb, String dtConfigId);
	
	/**
	 * <pre>getTablenameTxt(通过表标识获取配置字段名称)   
	 * @author guoyanfei
	 * @param dtConfigId(表标识) 
	 * @param cfgDb(数据源)
	 * @return</pre>
	 */
	String getFieldnameTxt(CfgDb cfgDb, String dtConfigId);
	
	/**
	 * @description 通过服务ID和服务类型查询改服务的显示字段拼接串
	 * @param cfgDb(数据源)
	 * @param serviceID(服务ID)
	 * @param serviceType(服务类型:1单表服务,2主从表服务)
	  * @param masterDetailId(主从表服务-从表信息ID)
	 * @param dtConfigId(表标识)
	 * @return 字段拼接串
	 * @author guoyanfei
	 * @date 2017/11/17
	 */
	String getFieldnameByserviceID(CfgDb cfgDb, String serviceID, String serviceType, String dtConfigId, String masterDetailId);

	/**
	 * 
	 * @Title: loadWhereSql 
	 * @Description: TODO(根据不同的数据库类型返回不同的条件语句) 
	 * @author guoyanfei
	 * @return String
	 * @throws
	 */
	String loadWhereSql(CfgDb cfgDb, List<ConQueryVo> list);
	
	/**
	 * @title getQuerysqlByserviceId
	 * @description 通过服务查询其条件sql文
	 * @param serviceID(服务ID)
	 * @param serviceType(服务类型)
	 * @param grade(资源树层级关系)
	 * @return sql文
	 * @author guoyanfei
	 * @date 2017/12/1
	 */
	String getQuerysqlByserviceId(CfgDb cfgDb, String serviceID, String serviceType, String grade);

	// Here is for get field relation for queryField of service
	List<BaseQueryfieldExt> getQueryFieldObjectByServiceIdAndServiceType(CfgDb cfgDb, String serviceId, String serviceType);

	
	/**
	 * @title processSqlByFreemarker
	 * @description 转换freemarker语法sql文
	 * @param sql
	 * @param condition(条件参数集合)
	 * @return sql文
	 * @author guoyanfei
	 * @date 2017/12/1
	 */
	String processSqlByFreemarker(CfgDb cfgDb, String sql, Map condition);
	
	/**
	 * @Description 校验字段值
	 * @param cfgDb(数据源标识)
	 * @param serviceID(服务ID)
	 * @param conQuery字段值
	 * @param operationType(操作类型:add新增,update修改)
	 * @return Map<String, String>
	 * @author guoyanfei
	 * @date 2018/01/08
	 */
	Map<String, Object> validateFieldValue(CfgDb cfgDb, CfgEdit cfgEdit, String conQuery, String operationType);
	
	/**
	 * @Description:TODO(校验值是否正确)
	 * @param cfgDb(数据源)
	 * @param cfgEdit实体
	 * @param validateCode(校验Code)
	 * @param fieldCode(字段Code)
	 * @param fieldValue(字段值)
	 * @return Map<String,String>集合
	 * @author guoyanfei
	 * @date 2018/01/08
	 */
	Map<String, Object> validateResult(CfgDb cfgDb, CfgEdit cfgEdit, String validateCode, String fieldCode, String fieldValue);

	/**
	 * show 特殊处理执行MSSql数据库中增、删、改等sql语句
	 * by date 2018/02/23
	 * @param cfgDb 数据源实体
	 * @param strsql 需执行的sql
	 * @return 执行结果
	 * @author guoyanfei
	 */
	Integer executeMSSql(CfgDb cfgDb, String strsql);
	
	/**
	 * <pre>queryReportQueryParams(获取报表服务的查询参数)   
	 * @author：FanWenquan    
	 * @date：2018年2月27日 上午11:55:35   
	 * @param serviceID
	 * @return</pre>
	 */
	List<Map<String, String>> queryReportQueryParams(CfgDb cfgdb, String serviceID);


	// handle where condition by judge singleTable or view
	String handleWhereConditionByTableType(CfgDb cfgDb, String primaryKeyValueArray, CfgTable cfgTable);


	// here is return for view
	List<BaseShowfieldExt> getServiceShowFieldForView(CfgDb cfgDb, String serviceID, String serviceType,String masterDetailId) ;

}
